
/**
*copyright(c)2017-2020厦门风领科技有限公司
* http://www.fenglinghudong.com/
*
* 数学小工具
* chengen
* 2023-11-11 16:27:18
*/

export default class MathUtil {

    /**
     * 数组中移除某数值
     * @param arr 数组
     * @param index 需要移除的数值的索引
     */
    public static removeElementByIndex(arr, index: number): any {
        // 使用 slice 创建新数组，不影响原数组
        return arr.slice(0, index).concat(arr.slice(index + 1));
    }

    /**
     * 将一维数据转为特定二维数据
     * @param arr 一维数组
     * @param maxDiff 保留类型
     */
    static processArray(arr: number[], maxDiff: number, size: number): number[][] {
        // 步骤 1: 对一维数组进行从小到大排序
        arr.sort((a, b) => a - b);

        // 步骤 2: 记录 min 和 max
        const min = arr[0];
        const max = arr[arr.length - 1];

        // 步骤 3: 将相同的元素放入同一个子数组中
        const result: number[][] = [];
        let currentGroup: number[] = [];
        for (let i = 0; i < arr.length; i++) {
            if (i === 0 || arr[i] === arr[i - 1]) {
                // 当前元素与前一个相同，放入当前组
                currentGroup.push(arr[i]);
            } else {
                // 当前元素与前一个不同，创建新的组
                result.push([...currentGroup]);
                currentGroup = [arr[i]];
            }
        }
        // 处理最后一组
        if (currentGroup.length > 0) {
            result.push([...currentGroup]);
        }

        // 步骤 4: 过滤子数组，保留每个子数组的前N个元素
        const ballMax = size;
        const ret1 = result.map(group => group.slice(0, ballMax));

        // 步骤 5: 引入 maxDiff 参数，计算 Diff 和 offset，过滤子数组
        const diff = max - min;
        const offset = maxDiff;
        const ret = ret1.filter(group => {
            if (diff >= maxDiff) {
                return group[0] > max - offset;
            } else {
                return true;
            }
        });

        // 最终得到的经过多次过滤的精简二维数组
        return ret;
    }
}